<?php

/**
 * Mező objektum
 *
 * Értéke a mező nevének részeinek egyszerű felsorolása lehet,
 * vagy használható benne XQL_Function objektum, illetve az 'as'
 * azonosító használatával lehet mezőálnevet létrehozni.
 * 
 * Példa:
 * <code>
 * $o->set(
 * 		array(
 * 			'db',
 * 			'table',
 * 			'field', 
 * 			'as'=>'myfield'
 * 		)
 * );
 * </code>
 * kimenete: `db`.`table`.`field` AS `myfield`
 * 
 * <code>
 * $o->set(
 * 		array(
 * 			XQL_Function::create()->set('count', XQL_Field::create()->set(array('table', 'field'))),
 * 			'as' => 'cnt'
 * 		)
 * );
 * </code>
 * kimenete: count(`table`.`field`) AS `cnt`
 * 
 */
class XQL_Operator extends XQL_Object
{
	/**
	 * Az objektum neve. Meg kell egyeznie egy sémának a nevével, amelyre illeszthető.
	 *
	 * @var string
	 */
	protected $objectName = 'operator';
	
	/**
	 * Felépíti az osztályhoz tartozó sémát. Implementálása kötelező.
	 *
	 */
	protected function buildSchema()
	{
		$this->objectSchema = new XQL_OperatorSchema();
	}
	
	/**
	 * Visszatér egy példánnyal ugyanebből az osztályból.
	 *
	 * @return XQL_Operator
	 */
	public static function create()
	{
		return new XQL_Operator();
	}
	
	public function and_($item=NULL)
	{
		$op = 'AND';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function or_($item=NULL)
	{
		$op = 'OR';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function not_($item=NULL)
	{
		$op = 'NOT';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function isNull()
	{
		$op = 'IS';
		$item = 'NULL';
		return $this->set($op, $item);
	}
	
	public function is($item=NULL)
	{
		$op = 'IS';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
		
	public function isNotNull()
	{
		$op = 'IS NOT';
		$item = 'NULL';
		return $this->set($op, $item);
	}
	
	public function isNot($item=NULL)
	{
		$op = 'IS NOT';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function like($item=NULL)
	{
		$op = 'LIKE';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function notLike($item=NULL)
	{
		$op = 'NOT LIKE';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function regEx($item=NULL)
	{
		$op = 'REGEXP';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function notRegEx($item=NULL)
	{
		$op = 'NOT REGEXP';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function equals($item=NULL)
	{
		$op = '=';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function notEquals($item=NULL)
	{
		$op = '<>';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function greaterThen($item=NULL)
	{
		$op = '>';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function lesserThen($item=NULL)
	{
		$op = '<';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function greaterEqualsThen($item=NULL)
	{
		$op = '>=';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function lesserEqualsThen($item=NULL)
	{
		$op = '<=';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function divBy($item=NULL)
	{
		$op = '/';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function divIntBy($item=NULL)
	{
		$op = 'DIV';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function multipledWith($item=NULL)
	{
		$op = '*';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function minus($item=NULL)
	{
		$op = '-';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function plus($item=NULL)
	{
		$op = '+';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function mod($item=NULL)
	{
		$op = '%';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function in($item=NULL)
	{
		$op = 'IN';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function notIn($item=NULL)
	{
		$op = 'NOT IN';
		if ($item === NULL)
		{
			return $this->set($op);
		}
		else
		{
			return $this->set($op, $item);
		}
	}
	
	public function between($item1, $item2)
	{
		$op = 'BETWEEN';
		return $this->set($op, $item1, 'AND', $item2);
	}
	
	public function notBetween($item1, $item2)
	{
		$op = 'NOT BETWEEN';
		return $this->set($op, $item1, 'AND', $item2);
	}
	
	public function joining($tableRight, $onExpression)
	{
		$op = 'JOIN';
		return $this->set($op, $tableRight, 'ON', $onExpression);
	}
	
	public function leftJoin($tableRight, $onExpression)
	{
		$op = 'LEFT JOIN';
		return $this->set($op, $tableRight, 'ON', $onExpression);
	}
	
	public function rightJoin($tableRight, $onExpression)
	{
		$op = 'RIGHT JOIN';
		return $this->set($op, $tableRight, 'ON', $onExpression);
	}
	
	public function innerJoin($tableRight, $onExpression)
	{
		$op = 'INNER JOIN';
		return $this->set($op, $tableRight, 'ON', $onExpression);
	}
	
	public function outerJoin($tableRight, $onExpression)
	{
		$op = 'OUTER JOIN';
		return $this->set($op, $tableRight, 'ON', $onExpression);
	}
	
	public function union(XQL_Select $select)
	{
		$op = 'UNION';
		return $this->set($op, $select);
	}
	
	/**
	 * Kizárólag ennek az objektumnak az értékével tér vissza. Implementációja
	 * kötelező. A további megvalósításokban ügyelni kell arra, hogy az egyes
	 * érték elemek akár olyan objektumok is lehetnek, amelyek string-ként
	 * térhetnek vissza (például más XQL_Object leszármazottak).
	 *
	 * @return string
	 */
	public function get()
	{
		$items = array_values($this->objectValue);
		$result = '';
		
		$rItems = array();
		foreach ($items as $v)
		{
			if (is_object($v))
			{
				$rItems[] = (string)$v;
			}
			else
			{
				$rItems[] = $v;
			}
		}
		
		$result .= implode(' ', $rItems);
		
		return $result;
	}
	
}

?>